import gnu.io.CommPortIdentifier;

import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.util.Enumeration;
import java.io.File;
import java.io.FileOutputStream;
import javax.imageio.ImageIO;


public class SlideShowServer implements ActionListener {
	static Thread comm;
	static BluetoothComm btcomm;
	static FileChannel mfc;
	static FileLock mlock;
	static String COMNumber = null;
	final TrayIcon icon;

	public static void main( String arg[] )
	{
		try {
            // 多重起動チェック
			mfc = new FileOutputStream(new File("LockFile")).getChannel();
            mlock = mfc.tryLock();
             if (mlock == null) {
                //既に起動されているので終了する
                System.out.println("Running! exit!");
                return;
            }
        } catch (Exception e) {

        }

		try {
			new SlideShowServer();
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} catch (AWTException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}

	}

    /** コンストラクタ */
    public SlideShowServer() throws IOException, AWTException {

        // タスクトレイアイコン
        Image image = ImageIO.read(
                getClass().getResourceAsStream("icon-disconnect.bmp"));
        icon = new TrayIcon(image);

        // ポップアップメニュー
        PopupMenu menu = new PopupMenu();

        //COMメニュー
		Enumeration list = CommPortIdentifier.getPortIdentifiers();
		CommPortIdentifier portID;
		for(;list.hasMoreElements();)
		{
			portID = (CommPortIdentifier)list.nextElement();
			MenuItem com = new MenuItem(portID.getName());
			com.addActionListener(this);
			menu.add(com);
		}

        // 終了メニュー
        MenuItem exitItem = new MenuItem("終了");
        exitItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
            	if(btcomm != null)btcomm.destroyThread();
            	try {
					if(comm != null)comm.join();
					mlock.release();
					mfc.close();

					new File("LockFile").delete();
				} catch (InterruptedException e1) {
					// TODO 自動生成された catch ブロック
					e1.printStackTrace();
				} catch (IOException e2) {
					// TODO 自動生成された catch ブロック
					e2.printStackTrace();
				}
                System.exit(0);
            }
        });
        menu.add(exitItem);

        icon.setPopupMenu(menu);

        // タスクトレイに格納
        SystemTray.getSystemTray().add(icon);

    }

	@Override
	public void actionPerformed(ActionEvent e)
	{
		if(btcomm != null)btcomm.destroyThread();
		btcomm = new BluetoothComm(this);
		if(comm != null)
		{
			try {
				comm.join();
				comm = null;
			} catch (InterruptedException e1) {
				// TODO 自動生成された catch ブロック
				e1.printStackTrace();
			}
		}
		comm = new Thread(btcomm);
		btcomm.setCOMNumber(e.getActionCommand());
		comm.start();
	}

	public void setConnectImage()
	{
		Image image = null;
		try {
			image = ImageIO.read(
			        getClass().getResourceAsStream("icon-connect.bmp"));
		} catch (IOException e1) {
			// TODO 自動生成された catch ブロック
			e1.printStackTrace();
		}
		icon.setImage(image);
	}

	public void setDisConnectImage()
	{
		Image image = null;
		try {
			image = ImageIO.read(
			        getClass().getResourceAsStream("icon-disconnect.bmp"));
		} catch (IOException e1) {
			// TODO 自動生成された catch ブロック
			e1.printStackTrace();
		}
		icon.setImage(image);
	}
}